<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
namespace org\copperforest\oak\im;

class IMHandler
{

    static function send( IMAbstractMessage $mensaje, $users )
    {
        $actual = $_SERVER[ 'REQUEST_TIME' ];

        $tiempo = ini_get( 'session.gc_maxlifetime' );
        if ( empty( $tiempo ) ) $tiempo = 1440;

        $memcache = Deployment::getMemcached();

        foreach ( $users as $u ) {
            //puedo hacer un lock con el acceso a un archivo que bloquee el acceso a los datos de un usuario concreto
            //con lo que necesito un archivo por usuario, lo bloquearemos con un bloqueo de escritura
            $fp = fopen( TEMP_PATH . $u . '.messages', 'w' );
            if ( $fp ) {
                $mensajes = $memcache->get( FINGERPRINT . '#MSG#' . $u ); //si entre estas dos instrucciones llegan mensajes no lo recibimos

                if ( !$mensajes ) {
                    $mensaje->time = $_SERVER[ 'REQUEST_TIME' ];
                    $memcache->set( FINGERPRINT . '#MSG#' . $u,
                            array( $mensaje ), null, $tiempo );
                } else {
                    $recientes = array( );
                    foreach ( $mensajes as $m )
                            if ( (($m->time) - $actual) < 15 )
                                $recientes[ ] = $m;

                    $recientes[ ] = $mensaje; //lo metemos de último
                    $mensaje->time = $_SERVER[ 'REQUEST_TIME' ];

                    if ( !$memcache->replace( FINGERPRINT . '#MSG#' . $u,
                                    $recientes, null, $tiempo ) ) //espero que esto serialize inmediantamente!!!!!!!
                            $memcache->set( FINGERPRINT . '#MSG#' . $u,
                                $recientes, null, $tiempo );
                }

                fclose( $fp );
            }
            //esto debiera recuperar el array y comprobar cuales siguen vivos y cuales no
        }



        //QUE TIEMPO DEBERÍA PONER AQUI... NO DEMASIADO
        //el tiempo que dura un mensaje en el aire no debería ser más alla de 10 pulsaciones de pull o mas o menos 60 segundos
        //si aqui establezco el tiempo puedo llevar el conteo del tiempo para
        //de esta forma aseguro que todos los anteriores son anteriores en el tiempo y todos los posteriores son posteriores en el tiempo y
        //todos los anteriores en el tiempo son anteriores
    }

    static function obtain( $time, $accept = array( ) )
    {
        $IMTime = $time;
        $uid = User::getLogged()->getId();
        $mensajes = Deployment::getMemcached()->get( FINGERPRINT . '#MSG#' . $uid ); //si entre estas dos instrucciones llegan mensajes no lo recibimos

        $accepted = array( );

        if ( $mensajes ) {
            foreach ( $mensajes as $m ) {
                if ( $m->time > $time ) {
                    if ( $m->accept( $accept[ $m->callback ] ) ) {

                        if ( !isset( $accepted[ $m->callback ] ) )
                                $accepted[ $m->callback ] = array( );

                        $accepted[ $m->callback ][ ] = $m;
                    }
                    $IMTime = $m->time;
                }
            }

            if ( count( $mensajes ) > 0 && ($_SERVER[ 'REQUEST_TIME' ] - $IMTime) > 15 ) { //ni un solo mensaje en los ultimos 15 segundos
                $fp = fopen( TEMP_PATH . $uid . '.messages', 'w' );
                if ( $fp ) {
                    $memcache = Deployment::getMemcached();

                    $memcache->delete( FINGERPRINT . '#MSG#' . $uid );
                    fclose( $fp );
                }
            }
        }

        return array( $IMTime, $accepted );
    }

}